小demo:对德文数据进行文本分析
昨天做了一个德文数据的词频统计,发来的数据是word文件,如下
für mich ging es bei einem foto mit präsident erdogan nicht um politik oder um wahlen, sondern darum, das höchste amt des landes meiner familie zu respektieren.“deutsche fußball-fans hatten özil und gündogan das erdogan-foto übel genommen
一开始我以为他发错的数据有问题,不然怎么会 乱码
呢!后来才知道,数据文件没错,德文的有些字符长得比较奇特。让我对word的德文文档做词频统计,按照流程顺序
读取docx文件的文本数据
对德文进行词频统计
输出到csv或者xlsx
现在我们已经将任务分成了四个部分,每个部分如果有无法实现的地方,可以百度谷歌,最后将各部分拼接起来,这个任务就完成了。
下面我们开始做吧
读取docx文件
百度搜了一遍,发现有一个 docx
库可以实现读取,而且找到现成的代码可供使用。
docx库的安装方法
pip install python-docx
安装好docx库之后,我们定义了read_docx函数用来读取docx文件,返回文本内容
import docx
def read_docx(file):
#file:待读取的docx文件
fileobj=docx.Document(file)
content = ''
for para in fileobj.paragraphs:
content+=para.text
return content.lower()
我们做一个下测试,试着读取一下
Özil verteidigt seinErdogan-Foto.docx
file = 'Özil verteidigt sein Erdogan-Foto.docx'
te text = read_docx(file=
)
#只显示前100个字符
text[:100]
运行结果
'was auch immer das ergebnis der letzten wahl gewesen wäre, oder der wahl davor, ich hätte das bild '
对德文进行词频
我直接在github上搜索德文切词库找到 SoMaJo
库,安装方法
pip install SoMaJo
分词的代码也找到了,直接定义为 segment函数
from somajo import Tokenizer
def segment(text):
# text:待传入的德语文本
#分词器初始化
tokenizer = Tokenizer(split_camel_case=True, token_classes=False, extra_info=False)
#用于存放词语及对应出现频数的字典
wordfreq = dict()
wordlist = tokenizer.tokenize(text)
wordset = set(wordlist)
#剔除掉长度小于等于1的单词
wordset = set([w for w in wordset if len(w)>1])
for w in wordset:
wordfreq.setdefault(w, 0)
wordfreq[w]+=wordlist.count(w)
output = sorted(wordfreq.items(), key=lambda k: k[1], reverse=True)
return output
我们试试segment函数是否能正常运行
wordfreq = segment(text)
wordfreq
运行结果
[('der', 24),
('das', 18),
('und', 18),
('in', 17),
('ich', 16),
('nicht', 13),
('haben', 12),
('es', 12),
......
......
......
('dort', 1),
('geäußert', 1),
('programm', 1),
('steinmeier', 1),
('allen', 1),
('sogar', 1),
('gesorgt', 1),
('hätten', 1),
('bewusst', 1),
('schwieg', 1),
('fußball', 1),
('dfb', 1),
('aus', 1),
('eigenen', 1),
('erklärung', 1),
输出结果
将结果保存到xlsx文件中,第一列是词语,第二列是词频。往常我们都是保存到csv文件中,但是发现用excel打开csv时,德文真的乱码了。那些奇怪的字符被更奇怪的乱码替换了。我直接google搜
how toexportgermanintoexcelusingpython
得到下面的结果
搜索结果的第一个结果里找到我需要的代码。我这里定义为to_xlsx函数
import pandas as pd
def to_xlsx(wordfreq, excelfilename):
# wordfreq: segment(text)得到的结果
# excelfilename: xlsx文件名
writer = pd.ExcelWriter(excelfilename, options={'encoding': 'utf-8'})
df = pd.DataFrame(wordfreq, columns=['词语', '词频'])
df.to_excel(writer, 'Sheet1')
writer.save()
在这里我们测试下 to_xlsx函数,看看能否输出xlsx。
to_xlsx(wordfreq,'output.xlsx')
我们打开 output.xlsx
文件,如下图
完美!
现在我们将上面的代码组装起来
import docx
import pandas as pd
from somajo import Tokenizer
def read_docx(file):
#file:待读取的docx文件
fileobj=docx.Document(file)
content = ''
for para in fileobj.paragraphs:
content+=para.text
return content.lower()
def segment(text):
# text:待传入的德语文本
#分词器初始化
tokenizer = Tokenizer(split_camel_case=True, token_classes=False, extra_info=False)
#用于存放词语及对应出现频数的字典
wordfreq = dict()
wordlist = tokenizer.tokenize(text)
wordset = set(wordlist)
#剔除掉长度小于等于1的单词
wordset = set([w for w in wordset if len(w)>1])
for w in wordset:
wordfreq.setdefault(w, 0)
wordfreq[w]+=wordlist.count(w)
output = sorted(wordfreq.items(), key=lambda k: k[1], reverse=True)
return output
def to_xlsx(wordfreq, excelfilename):
# wordfreq: segment(text)得到的结果
# excelfilename: xlsx文件名
writer = pd.ExcelWriter(excelfilename, options={'encoding': 'utf-8'})
df = pd.DataFrame(wordfreq, columns=['词语', '词频'])
df.to_excel(writer, 'Sheet1')
writer.save()
text = read_docx(file='Özil verteidigt sein Erdogan-Foto.docx')
wordfreq = segment(text)
to_xlsx(wordfreq, 'output.xlsx')
精选文章
后台回复“20190218”,得到本文项目源码。
支持原创,记得手动点赞